package 音响系统.配置;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import 音响系统.唱片.I唱片;
import 音响系统.唱片.天之大;
import 音响系统.唱片.费玉清精粹;
import 音响系统.媒体播放器.I媒体播放器;
import 音响系统.媒体播放器.唱片播放器;

/**
 * 尽管我们可以同时使用组件扫描和显式配置，
 * 但在本节中，我们更加关注于显式配置，
 * 因此我将 `@ComponentScan` 注解移除掉了。
 */
@Configuration
public class 唱片播放器Config {

    /**
     * 默认情况下，Bean的ID与带有`@Bean`注解的方法名是一样的。
     *
     * 看起来，`I唱片`是通过调用`get专辑()`得到的，但情况并非完全如此。
     * 默认情况下，Spring中的Bean都是 单例 的,
     * 因为`get专辑()`方法上添加了`@Bean`注解，
     * Spring将会拦截所有对它的调用，并确保直接返回该方法所创建的Bean，而不是每次都对其进行实际的调用。
     * 也就因此，两个`I媒体播放器` Bean会得到相同的`I唱片`实例。
     * @return
     */
    @Bean
    public I唱片 get专辑() {
        return new 天之大();
    }

    /**
     * 请稍微发挥一下你的想象力，我们可能希望做一点稍微疯狂的事情，比如说，在一组CD中随机选择一个`I唱片`来播放：
     * 【第一次是随机的，后面就是相同的了，可以在Test中试着多个测试】
     * @return
     */
//    @Bean
//    public I唱片 get专辑Random() {
//        int choice = (int) Math.floor(Math.random() * 2);
//        if (choice == 0) {
//            System.out.println("天之大");
//            return new 天之大();
//        }else{
//            System.out.println("费玉清精粹");
//            return new 费玉清精粹();
//        }
//    }

    /**
     * @param 唱片
     * @return
     */
    @Bean
    public I媒体播放器 get媒体播放器(I唱片 唱片){
        return new 唱片播放器(唱片);
    }

//    @Bean
//    public I媒体播放器 get媒体播放器() {
//        return new 唱片播放器(get专辑());
//    }


}